package com.akoj.anmu.service;

import com.akoj.model.domain.dto.user.UserRegisterRequest;
import com.akoj.model.domain.dto.user.UserUpdateRequest;
import com.akoj.model.domain.entity.User;
import com.akoj.model.domain.vo.LoginUserVO;
import com.akoj.model.domain.vo.UserVO;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 用户服务
 * @author AK
 * @description 针对表【user】的数据库操作Service
 * @createDate 2024-10-14 20:20:26
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     * @param userRegisterRequest
     * @return
     */
    Long UserRegister(UserRegisterRequest userRegisterRequest);


    /**
     * 用户登录
     * @param userAccount 用户账户
     * @param userPassword 用户密码
     * @param request 请求
     * @return 登录用户信息
     */
    LoginUserVO doLogin(String userAccount, String userPassword, HttpServletRequest request);


    /**
     * 查询用户列表
     * @param nickName 昵称
     * @return 用户信息列表
     */
    List<UserVO> searchUsersByNickName(String nickName);

    /**
     * 删除用户信息
     * @param id 用户ID
     * @return 删除结果
     */
    Boolean deleteUserById(Long id);

    /**
     * 用户注销
     * @param request 请求体
     * @return 注销结果
     */
    Boolean doLogout(HttpServletRequest request);

    /**
     * 根据标签列表查询用户
     * @param tags 标签列表
     * @return 用户列表
     */
    List<UserVO> searchUsersByTags(List<String> tags,  LoginUserVO currentUser);

    /**
     * 获取当前登录用户
     * @param request 请求
     * @return 脱敏后的登录用户信息
     */
    LoginUserVO getCurrentUser(HttpServletRequest request);

    /**
     * 判断是否为管理员
     * @param request 请求
     * @return 判断结果
     */
    Boolean isAdmin(HttpServletRequest request);

    /**
     * 更新用户信息
     * @param userUpdateRequest 更新用户请求体
     * @return 更新后的用户信息
     */
    UserVO updateUser(UserUpdateRequest userUpdateRequest, LoginUserVO loginUser);

    List<UserVO> searchRecommendUsers(HttpServletRequest request, long pageNum, long pageSize);

    List<UserVO> matchUsers(LoginUserVO currentUser);
}
